package cn.mujiankeji.mbrowser.界面.框架

import android.annotation.SuppressLint
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import cn.mujiankeji.mbrowser.界面.标签页.网页.网页标签状态
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment
import cn.mujiankeji.mbrowser.app.界面模块

import cn.mujiankeji.mbrowser.界面.标签页.网页.网页标签实现
import cn.mujiankeji.mbrowser.界面.标签页.聚搜.聚搜页面实现
import cn.mujiankeji.mbrowser.界面.标签页.聚搜.聚搜页面状态
import cn.mujiankeji.mbrowser.界面.标签页.书签.书签标签实现
import cn.mujiankeji.mbrowser.界面.标签页.书签.书签标签状态
import cn.mujiankeji.mbrowser.界面.框架.主视图.底部导航
import cn.mujiankeji.mbrowser.界面.框架.主视图.底部进度条
import cn.mujiankeji.mbrowser.界面.框架.主视图.标签页状态
import cn.mujiankeji.mbrowser.界面.框架.主视图.顶部工具栏
import org.koin.compose.koinInject
import cn.mujiankeji.mbrowser.界面.标签页.历史.历史标签状态
import cn.mujiankeji.mbrowser.界面.标签页.历史.历史标签实现
import cn.mujiankeji.mbrowser.界面.标签页.搜索引擎.搜索引擎管理页面实现
import cn.mujiankeji.mbrowser.界面.标签页.搜索引擎.搜索引擎管理页面状态
import cn.mujiankeji.mbrowser.界面.标签页.搜索引擎.搜索引擎编辑实现
import cn.mujiankeji.mbrowser.界面.标签页.搜索引擎.搜索引擎编辑状态
import cn.mujiankeji.mbrowser.界面.标签页.源码.源码标签页实现
import cn.mujiankeji.mbrowser.界面.标签页.源码.源码标签页状态
import cn.mujiankeji.mbrowser.界面.标签页.脚本.脚本编辑标签页实现
import cn.mujiankeji.mbrowser.界面.标签页.脚本.脚本编辑标签状态
import cn.mujiankeji.mbrowser.界面.框架.主视图.手势导航
import androidx.compose.ui.geometry.Offset
import cn.mujiankeji.mbrowser.界面.标签页.下载管理页面实现
import cn.mujiankeji.mbrowser.界面.标签页.下载管理页面状态
import cn.mujiankeji.mbrowser.界面.标签页.主页.主页标签实现
import cn.mujiankeji.mbrowser.界面.标签页.主页.主页标签状态
import cn.mujiankeji.mbrowser.界面.标签页.关于页面实现
import cn.mujiankeji.mbrowser.界面.标签页.关于页面状态
import cn.mujiankeji.mbrowser.界面.标签页.视频播放页面.视频播放页面实现
import cn.mujiankeji.mbrowser.界面.标签页.视频播放页面.视频播放页面状态
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照状态_列表
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照实现_列表
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照状态_章节列表
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照实现_视频
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照实现_阅读
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照状态_视频
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照状态_阅读
import cn.mujiankeji.mbrowser.界面.标签页.阅读页面.阅读页面实现
import cn.mujiankeji.mbrowser.界面.标签页.阅读页面.阅读页面状态
import cn.mujiankeji.mbrowser.界面.标签页.页面管理.页面管理标签实现
import cn.mujiankeji.mbrowser.界面.标签页.页面管理.页面管理标签状态
import androidx.compose.runtime.DisposableEffect
import cn.mujiankeji.mbrowser.工具.mlog
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照管理页面实现
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照管理页面状态
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照编辑页面实现
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照编辑页面状态


@Composable
fun 界面主视图( state: 界面模块 = koinInject()){
    // 手势导航状态
    var 显示手势导航 by remember { mutableStateOf(false) }
    // 触摸状态
    var 触摸中 by remember { mutableStateOf(false) }
    // 当前触摸位置
    var 当前触摸位置 by remember { mutableStateOf(Offset.Zero) }
    // 选中的按钮
    var 选中按钮索引 by remember { mutableStateOf(0) }
    
    Box(modifier = Modifier.fillMaxSize()) {
        // 主界面内容
        Scaffold(
            containerColor = MaterialTheme.colorScheme.surface,
            topBar = {
                顶部工具栏()
            },
            bottomBar = {
                Column(Modifier.padding(WindowInsets.navigationBars.asPaddingValues())) {
                    // 底部栏包含加载进度条和实际的底部工具栏
                    Column(modifier = Modifier.fillMaxWidth().height(57.dp)) {
                        Box(Modifier.fillMaxWidth().height(2.dp)){
                            底部进度条(state)
                        }
                        
                        // 底部工具栏
                        Box(Modifier.fillMaxWidth().height(55.dp)){
                            底部导航(
                                界面模块 = state,
                                onSwipeUp = { 
                                    // 显示手势导航
                                    显示手势导航 = true 
                                },
                                onTouchStateChanged = { isTouching, position ->
                                    // 更新触摸状态和位置
                                    触摸中 = isTouching
                                    当前触摸位置 = position
                                    
                                    // 如果手指抬起且导航菜单正在显示，则关闭导航菜单
                                    if (!isTouching && 显示手势导航) {
                                        // 注意：关闭导航会在手势导航组件的onButtonSelected回调中处理
                                        // 这里不需要额外设置显示手势导航 = false
                                    }
                                }
                            )
                        }
                    }
                }
            }
        ) { paddingValues ->
            Box(Modifier.padding(bottom = paddingValues.calculateBottomPadding())
                .background(MaterialTheme.colorScheme.background)){
                内容实现()

                // 手势导航组件（覆盖在所有内容之上）
                手势导航(
                    界面模块 = state,
                    显示 = 显示手势导航,
                    触摸状态 = 触摸中,
                    当前触摸位置 = 当前触摸位置,
                    onDismissRequest = { 显示手势导航 = false },
                )
            }
        }
    }

    mlog("eee")
}

/**
 * 窗口内容实现(主内容)
 * 使用 HorizontalPager 管理和显示当前窗口的所有标签页内容
 * 支持左右翻页和上下切换标签页
 */
@OptIn(ExperimentalFoundationApi::class)
@SuppressLint("SetJavaScriptEnabled")
@Composable
private fun 内容实现() {
    val viewModel: 界面模块 = koinInject()
    // 获取当前活动窗口
    val 当前活动窗口 by viewModel.当前活动窗口.collectAsState()
    if (当前活动窗口 == null) return

    val 标签页列表 = 当前活动窗口?.标签页列表 ?: emptyList()
    // 获取当前活动标签页索引
    val 活动标签页索引 by 当前活动窗口!!.当前活动标签页索引

    // 创建并记住 PagerState，初始页面为当前活动标签页
    val pagerState = rememberPagerState(
        initialPage = 活动标签页索引.coerceIn(0, (标签页列表.size - 1).coerceAtLeast(0)),
        pageCount = { 标签页列表.size }
    )

    // 当活动标签页索引变化时滚动到对应页面
    LaunchedEffect(活动标签页索引) {
        if (活动标签页索引 != pagerState.currentPage && 
            标签页列表.isNotEmpty() && 
            活动标签页索引 >= 0 && 
            活动标签页索引 < 标签页列表.size) {
            
            pagerState.scrollToPage(活动标签页索引)
        }
    }
    
    // 当用户滑动翻页器时更新活动标签页索引并处理生命周期
    LaunchedEffect(pagerState) {
        snapshotFlow { pagerState.currentPage }.collect { page ->
            if (page != 活动标签页索引 && 标签页列表.isNotEmpty()) {
                // 暂停之前的活动标签页
                标签页列表.getOrNull(活动标签页索引)?.界面暂停()
                
                // 切换到新的标签页
                当前活动窗口!!.切换标签页(page)
                
                // 恢复新的活动标签页
                标签页列表.getOrNull(page)?.界面恢复()
            }
        }
    }
    
    // 处理标签页恢复和暂停的生命周期
    LaunchedEffect(活动标签页索引, 标签页列表.size) {
        // 确保当前活动标签页处于恢复状态，其他标签页处于暂停状态
        标签页列表.forEachIndexed { index, 标签页 ->
            if (index == 活动标签页索引) {
                标签页.界面恢复()
            } else {
                标签页.界面暂停()
            }
        }
    }
    
    // 处理组件销毁时的清理
    DisposableEffect(标签页列表) {
        onDispose {
            // 当组件销毁时，暂停所有标签页
            标签页列表.forEach { it.界面暂停() }
        }
    }

    // 使用 HorizontalPager 显示标签页内容
    HorizontalPager(
        state = pagerState,
        modifier = Modifier
            .fillMaxSize()
            .background(MaterialTheme.colorScheme.background),
        beyondViewportPageCount = 1, // 预加载前后各一页，减少切换时的延迟
        userScrollEnabled = true,
        key = { index -> 标签页列表.getOrNull(index)?.标识 ?: index.toString() }
    ) { pageIndex ->
        val 标签页 = 标签页列表.getOrNull(pageIndex)
        标签页内容视图(标签页)
    }
}

/**
 * 标签页内容视图
 * 根据标签页类型渲染对应的内容
 */
@Composable
private fun 标签页内容视图(state: 标签页状态?) {
    if (state == null) {
        // 渲染空页面
        Box(
            modifier = Modifier
                .fillMaxSize()
                .background(MaterialTheme.colorScheme.background),
            contentAlignment = Alignment.Center
        ) {
            Text("空页面")
        }
    } else {
        // 根据标签页类型渲染对应的内容
        when (state) {
            is 网页标签状态 -> 网页标签实现(state)
            is 书签标签状态 -> 书签标签实现(state)
            is 历史标签状态 -> 历史标签实现(state)
            is 搜索引擎编辑状态 -> 搜索引擎编辑实现(state)
            is 搜索引擎管理页面状态 -> 搜索引擎管理页面实现(state)
            is 源码标签页状态 -> 源码标签页实现(state)
            is 脚本编辑标签状态 -> 脚本编辑标签页实现(state)
            is 主页标签状态 -> 主页标签实现(state)
            is 关于页面状态 -> 关于页面实现(state)
            is 视频播放页面状态<*> -> 视频播放页面实现(state)
            is 阅读页面状态 -> 阅读页面实现(state)
            is 聚搜页面状态 -> 聚搜页面实现(state)
            is 下载管理页面状态 -> 下载管理页面实现(state)
            is 页面管理标签状态 -> 页面管理标签实现(state)
            is 快照状态_列表 -> 快照实现_列表(state)
            is 快照状态_章节列表 -> 快照状态_章节列表(state)
            is 快照状态_视频 -> 快照实现_视频(state)
            is 快照状态_阅读 -> 快照实现_阅读(state)
            is 快照管理页面状态 -> 快照管理页面实现(state)
            is 快照编辑页面状态 -> 快照编辑页面实现(state)
            else -> {
                // 未知类型的标签页
                Box(
                    modifier = Modifier
                        .fillMaxSize()
                        .background(MaterialTheme.colorScheme.background),
                    contentAlignment = Alignment.Center
                ) {
                    Text("未知标签页类型: ${state.javaClass.simpleName}")
                }
            }
        }
    }
}